package sthelp

import (
	"archive/zip"
	"fmt"
	"io"
	"io/fs"
	"os"
	"path/filepath"
	"strings"
)

func PathExists(path string) bool {
	_, err := os.Stat(path)
	if err == nil {
		return true
	}
	if os.IsNotExist(err) {
		return false
	}
	return false
}

// copyFile 把a复制到b
func copyFile(a string, b string) {
	b_the, _ := os.Create(b)
	the, _ := os.Open(a)
	io.Copy(b_the, the)
	b_the.Close()
}

// CopyDir 复制目录src到目录dest
func CopyDir(src string, dest string) {
	filepath.Walk(src, func(path string, info fs.FileInfo, err error) error {
		if info.IsDir() {
			tocreate := strings.ReplaceAll(path, src, "")
			os.Mkdir(filepath.Join(dest, tocreate), 0777)
			fmt.Println("creating", filepath.Join(dest, tocreate))
		} else {
			tocreate := strings.ReplaceAll(path, src, "")
			copyFile(path, filepath.Join(dest, tocreate))
			fmt.Println("copying", path, "to", filepath.Join(dest, tocreate))
		}
		return nil
	})
}

// ToZip 压缩文件夹到zip文件
func ToZip(src string, dest string) error {
	// 创建一个 zip.Writer 对象
	i, err := os.Create(dest)
	if err != nil {
		return err
	}
	zipWriter := zip.NewWriter(i)
	// 创建一个文件遍历器
	e := filepath.Walk(src, func(path string, info fs.FileInfo, err error) error {
		// 如果是目录，则忽略
		if info.IsDir() {
			return nil
		}
		// 创建一个文件
		file, err := zipWriter.Create(strings.ReplaceAll(path, src, ""))
		if err != nil {
			return err
		}
		// 创建一个文件读取器
		fileReader, err := os.Open(path)
		if err != nil {
			return err
		}
		// 将文件写入 zip 文件
		_, err = io.Copy(file, fileReader)
		if err != nil {
			return err
		}
		// 关闭文件读取器
		fileReader.Close()
		return nil
	})
	// 关闭 zip 文件
	defer zipWriter.Close()
	return e
}
